package com.thinkgsp.jxc.persistence;

import java.math.BigDecimal;
import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.thinkgsp.jxc.model.RpArpBill;
import com.thinkgsp.jxc.model.RpBill;
import com.thinkgsp.jxc.model.RpContact;

/**
 * 客户往来持久化类
 * @author evan
 *
 */
public interface RpContactMapper {

	/**
	 * 获取往来记录
	 * @param id
	 * @return
	 */
	public RpContact getRpContact(Long id);
	
	/**
	 * 根据应收应付单据查找往来记录
	 * @param arpBillId
	 * @return
	 */
	public RpContact findRpContactByArpBill(Long arpBillId);
	
	/**
	 * 根据收款付款表查找往来记录
	 * @param rpBillId
	 * @return
	 */
	public RpContact findRpContactByRpBill(Long rpBillId);
	
	/**
	 * 查询往来记录
	 * @param begPeriod
	 * @param endPeriod
	 * @param custId
	 * @return
	 */
	public List<RpContact> getRpContactList(@Param(value="begPeriod")BigDecimal begPeriod,@Param(value="endPeriod")BigDecimal endPeriod,@Param(value="custId")Integer custId);
	
	
	/**
	 * 查询往来记录(不包含核销)
	 * @param begPeriod
	 * @param endPeriod
	 * @param custId
	 * @return
	 */
	public List<RpContact> getRpContactListNotCheck(@Param(value="begPeriod")BigDecimal begPeriod,@Param(value="endPeriod")BigDecimal endPeriod,@Param(value="custId")Integer custId);
	
	
	/**
	 * 查询往来记录
	 * @param begPeriod
	 * @param endPeriod
	 * @param custId
	 * @param direct
	 * @return
	 */
	public List<RpContact> getRpContactListByDirect(@Param(value="begPeriod")BigDecimal begPeriod,@Param(value="endPeriod")BigDecimal endPeriod,@Param(value="custId")Integer custId,@Param(value="direct") Integer direct);
	
	
	/**
	 * 根据应收应付生成往来记录
	 * @param arpBill
	 */
	public void recordContactByArpBill(RpArpBill arpBill);
	
	/**
	 * 根据应收应付Id删除往来记录
	 * @param arpBillId
	 * @return
	 */
	public int revokeContactByArpBill(Long arpBillId);
	
	/**
	 * 根据收款付款生成往来记录
	 * @param rpBill
	 */
	public void recordContactByRpBill(RpBill rpBill);
	
	/**
	 * 根据收款付款Id删除往来记录
	 * @param rpBillId
	 * @return
	 */
	public int revokeContactByRpBill(Long rpBillId);
	
	/**
	 * 单据核销
	 * @param id
	 * @param amount
	 * @return
	 */
	public int billCheck(@Param(value="id")Long id,@Param(value="amount")BigDecimal amount);
	
	/**
	 * 单据反核销
	 * @param id
	 * @param amount
	 * @return
	 */
	public int billUnCheck(@Param(value="id")Long id,@Param(value="amount")BigDecimal amount);
	
	/**
	 * 插入往来记录,本方法主要用于核销单据时使用
	 * @param contact
	 */
	public void insertContact(RpContact contact);
	
	/**
	 * 删除往来记录，本方法主要用于反核销单据时使用
	 * @param id
	 */
	public void deleteContact(Long id);
	
	/**
	 * 获取应收应付单是否已经核销
	 * @param arpBillId
	 * @return
	 */
	public Boolean isArpBillCheck(Long arpBillId);
	
	/**
	 * 获取收款付款单是否已经核销
	 * @param rpBillId
	 * @return
	 */
	public Boolean isRpBillCheck(Long rpBillId);

	/**
	 * 往来表期末结转,本方法必须在存货表结转之后执行
	 * @param curYear 当前年份
	 * @param curPeriod 当前期间
	 * @param nextYear 下一期年份
	 * @param nextPeriod 下一期期间
	 */
	public void periodEndForward(@Param(value="curYear") Integer curYear,@Param(value="curPeriod") Integer curPeriod,@Param(value="nextYear") Integer nextYear,@Param(value="nextPeriod") Integer nextPeriod);
	
	/**
	 * 查询客户的欠款天数
	 * @param custId
	 * @return
	 */
	public Integer getCustomerDebtDay(Integer custId);
	
	/**
	 * 清空往来明细表
	 */
	public void clearRpContact();
	/**
	 * 清空应收应付款表
	 */
	public void clearArpBill();
	/**
	 * 清空收付款表
	 */
	public void clearRpBill();
	/**
	 * 清空应收应付款明细表
	 */
	public void clearRpBillDetail();
	/**
	 * 清空核销日志
	 */
	public void clearCheckLog();
	
}
